/**
 * 导出功能辅助模块
 * 用于处理所有前端导出功能的通用逻辑
 */
// 导入axios实例
import service from '@/utils/request'
import { Message } from 'element-ui';
import i18n from '@/i18n'; // 导入i18n实例

/**
 * 通用导出方法
 * @param {Object} options - 导出选项
 * @param {string} options.url - 导出接口URL
 * @param {Object} options.params - 请求参数
 * @param {string} options.defaultFileName - 默认文件名（不包含日期和扩展名）
 * @param {function} options.beforeExport - 导出前回调
 * @param {function} options.afterExport - 导出后回调
 * @param {function} options.onError - 错误回调
 * @param {string} options.fileType - 文件类型(csv)，决定MIME类型和扩展名
 * @param {function} options.getCustomFileName - 自定义文件名生成函数
 * @returns {Promise<void>}
 */
export const exportFile = async (options) => {
  const {
    url,
    params = {},
    defaultFileName = '导出数据',
    beforeExport,
    afterExport,
    onError,
    fileType = 'csv', // 默认为CSV格式
    getCustomFileName
  } = options;

  // 文件类型配置
  const fileTypeConfig = {
    csv: {
      mimeType: 'text/csv',
      extension: '.csv'
    }
  };

  // 获取文件类型设置
  const currentFileType = fileTypeConfig[fileType] || fileTypeConfig.csv;

  try {
    // 导出前回调
    if (typeof beforeExport === 'function') {
      beforeExport();
    }

    // 显示加载提示
    Message.info(i18n.t('common.exporting'));

    // 发送导出请求，使用axios实例直接处理
    const response = await service({
      url,
      method: 'get',
      params,
      responseType: 'blob',
      // 对于文件下载，我们需要完整的响应
      transformResponse: [data => data]
    });

    // 检查是否返回错误信息（JSON格式）
    const contentType = response.headers && response.headers['content-type'];
    if (contentType && contentType.includes('application/json')) {
      // 将Blob转换为文本
      const result = await new Promise((resolve) => {
        const reader = new FileReader();
        reader.onload = () => resolve(reader.result);
        reader.readAsText(response.data);
      });

      try {
        const errorData = JSON.parse(result);
        const errorMessage = errorData.msg || i18n.t('common.exportFailed');
        Message.error(errorMessage);
        
        if (typeof onError === 'function') {
          onError(new Error(errorMessage));
        }
        return;
      } catch (e) {
        const errorMessage = i18n.t('common.exportFailed');
        Message.error(errorMessage);
        
        if (typeof onError === 'function') {
          onError(new Error(errorMessage));
        }
        return;
      }
    }

    // 检查响应内容是否为空
    if (!response.data || response.data.size === 0) {
      const errorMessage = i18n.t('common.exportNoData');
      Message.warning(errorMessage);
      if (typeof onError === 'function') {
        onError(new Error(errorMessage));
      }
      return;
    }

    // 正常处理文件下载
    const blob = new Blob([response.data], { type: currentFileType.mimeType });
    const downloadUrl = window.URL.createObjectURL(blob);
    const link = document.createElement('a');
    link.href = downloadUrl;

    // 生成文件名
    let fileName;
    
    // 尝试从响应头中获取文件名
    const disposition = response.headers['content-disposition'];
    if (disposition && disposition.includes('filename')) {
      try {
        // 尝试匹配 filename*=UTF-8''filename.xxx 格式
        const filenameRegex = /filename\*=UTF-8''([^;]*)/;
        let matches = filenameRegex.exec(disposition);
        
        if (matches && matches[1]) {
          fileName = decodeURIComponent(matches[1]);
        } else {
          // 尝试匹配 filename=filename.xxx 格式
          const simpleFilenameRegex = /filename=([^;]*)/;
          matches = simpleFilenameRegex.exec(disposition);
          if (matches && matches[1]) {
            fileName = decodeURIComponent(matches[1].replace(/['"]/g, ''));
          }
        }
      } catch (e) {
        console.error('解析文件名失败', e);
        fileName = null;
      }
    }
    
    // 如果未能获取到文件名，使用默认或自定义的文件名
    if (!fileName) {
      if (typeof getCustomFileName === 'function') {
        // 使用自定义文件名生成函数
        fileName = getCustomFileName(params) + currentFileType.extension;
      } else {
        // 使用默认文件名 + 当前日期
        const now = new Date();
        const dateStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
        fileName = `${defaultFileName}_${dateStr}${currentFileType.extension}`;
      }
    }
    
    link.download = fileName;
    document.body.appendChild(link);
    link.click();
    
    // 清理资源
    setTimeout(() => {
      document.body.removeChild(link);
      window.URL.revokeObjectURL(downloadUrl);
    }, 100);
    
    Message.success(i18n.t('common.exportSuccess'));
    
    // 导出后回调
    if (typeof afterExport === 'function') {
      afterExport();
    }
  } catch (error) {
    console.error('导出失败', error);
    Message.error(i18n.t('common.exportFailed'));
    
    if (typeof onError === 'function') {
      onError(error);
    }
  } finally {
    // 导出后回调（即使出错也会执行）
    if (typeof afterExport === 'function') {
      afterExport();
    }
  }
};

/**
 * 生成默认的导出文件名（带日期）
 * @param {string} baseName - 基础名称
 * @param {Object} params - 附加参数，可用于自定义文件名
 * @returns {string} 生成的文件名（不含扩展名）
 */
export const generateFileName = (baseName, params = {}) => {
  const now = new Date();
  const dateStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
  return `${baseName}_${dateStr}`;
};

export default {
  exportFile,
  generateFileName
}; 